本次我使用的組譯器是 NASM ( The Netwide Assembler ),我所使用的語法是 intel 的語法,將程式碼打在文字文件 ( 對你沒看錯 恭喜我達成人生成就 ),然後用 cmd 叫組譯器跟編譯器,這次我不會用 link.exe 而是用 gcc 來代替,所以只要準備 nasm 就好。而我只會用腦寫程式,撰寫流程都有個大概,但就是時做會直接爆炸,所以能盡量實作的部分我也盡量去挑戰自己,想辦法用組語寫出來。
NASM 的組譯器可以到它們的官網去下載,我的版本是2.15.05,有 win64 的載點,可以找 zip 的那一個,解壓完就有執行檔在裡面了。
可以將 nasm 的組譯器放進環境變數裡,這樣在用 cmd 時就可以直接調用 nasm ,而不需要再把 cmd 中的路徑移到組譯器的路徑底下才能用。
先複製組譯器的路徑,像我的路徑是
D:\Programming\ASM\nasm
打開設定->系統->關於,右邊的進階系統設定、右下的環境變數,點擊系統變數的Path那一欄並編輯,將剛才複製的路徑放進去就可以按下確定並關掉了。
接下來可以先打開 cmd 輸入 nasm 看有沒有輸出若有調用到則會先顯示
nasm: fatal: no input file specified
Type nasm -h for help
至此我們的環境就完成了。
NASM Tutorial這個網站提供 NASM 的教程可以去看看。
Compile Explorer 這裡也有提供一些語言的即時反組譯,可以自己先去那邊觀察一下自己寫的程式在轉成組語後會是甚麼樣子。
在這次的鐵人賽我會不時的穿插一些相關卻又不一定與主題有相關聯的知識,通常我會盡量挑較少人知道或注意到的冷知識來講。
題外 :
- 路徑
路徑有分為絕對路徑與相對路徑,絕對路徑就是從硬體槽直到所在地的完整路徑,例如我的 nasmD:\Programming\ASM\nasm\nasm.exe
這就是一個絕對路徑,在我的電腦中一定可以在這個位置找到這個檔案。
而使用 cmd 時若要回到上一層資料夾會輸入cd ..
例如我的 Wireshark 在D:\tools\Wireshark\Wireshark.exe
所以我的 nasm 對於 wireshark 的相對路徑即為..\..\..\Programming\ASM\nasm\nasm.exe
在撰寫程式需要引入檔案時記得要注意這件事情,因為許多人會在不了解的情況下使用到相對路徑,卻不知道為甚麼會抓不到檔案,因為引入時的相對路徑是該檔案與原始檔的相對路徑,所以下次在引入時發生錯誤的話不訪注意一下自己寫的路徑。
- 環境變數
在環境變數設定那邊,有分為使用者變數與系統變數,若是將路徑放在使用者變數底下,則換個使用者登入時會無法直接使用到剛設定進去的東西。若是放入系統變數則不會有這個問題,會讓所有使用者都能夠使用到這個路徑底下的東西。
在設定環境變數時有特別注意的話會發現到右側有上移與下移的功能鍵,那是因為它其實有優先度的問題,例如我裝了Python 2.7 與 3.9 ,而兩者的執行檔都叫 Python.exe ,若我的 2.7 的執行檔的路徑高於 3.9,則我在使用 python 指令時會優先找到 2.7 的執行檔並使用。
- 組語語法
組語語法主要有兩種,AT&T 與 intel ,兩者也有其差異性,具體可以直接到這篇文章做查看,例如參數格式與前後參數位置都有所不同。